/**
 * Looker  新闻整合系统
 * Author  :solosky
 * File    :URLUtils.java
 * Date    :May 21, 2009
 * Lisence : Apache License 2.0 
 */
package net.looker.util;

/**
 * URL工具集
 * @author solosky
 *
 */
public class URLUtils 
{

	
	/**
	 * 格式化URL
	 * 形如这样的URL： ./../../a/../../hah.jpg
	 */
	public static String real(String url)
	{
		//TODO ..以后补上
		return url;
	}
	
	/**
	 * 根据一个URL绝对化URL
	 * 比如http://www.baidu.com/article/a/list.php 与 ../../img/logo.jpg
	 * 格式化后的URL应该为 http://www.baidu.com/logo.jpg
	 */
	public static String real(String url, String absUrl)
	{
		//TODO .... 这里应该用栈来处理，以后完善。。。。-_-..
		String newUrl = null;
		//去掉新闻地址的最后一个文件
		absUrl = absUrl.substring(0, absUrl.lastIndexOf('/')-1);
		//替换原来的URL的\为/
		url = url.replace('\\', '/'); 
		//检查是否有http://开始的字串
		if (!url.startsWith("http://"))
		{
			//检查文件URL第一个字符
			char first = url.charAt(0);
			char next  = url.charAt(1);
			if (first=='.' && next=='.')
			{
				//前两个都是点，../img, 表示当前的文件是相对于URL的上一个目录，即应该继续去掉
			}
			else if (first=='.' && next=='/')
			{
				//表示当前目录 ,去掉点，并加上新闻页面的地址
				newUrl = absUrl+url.substring(1);
			}
			else if (first=='/')
			{
				// 相对于根目录
				newUrl = absUrl.substring(0,absUrl.indexOf('/',7))+url;
			}
			else
			{
				newUrl = absUrl+url;
			}
			return newUrl;
			
		}
		else
			return url;
	}
	
	/**
	 * 查找url域名
	 * @param url
	 * @return
	 */
	public static String domain(String url)
	{
		if(url.startsWith("http://"))
		{
			int pos = url.indexOf('/',7);	//从http://最后一个 /下一个搜索/ 如 http://www.freestu.net/job/
			return pos==-1 ? url.substring(7): url.substring(7,pos);
		}
		else
			return null;
	}
	
	/**
	 * 找出一个URL的文件名
	 */
	public static String file(String url)
	{
		if (url==null)
			return null;	
		url = url.replace('\\', '/');
		int start = url.lastIndexOf('/');
		int end   = url.lastIndexOf('?');
		
		if (start==-1)
			return url;
		else if(end==-1)
			return url.substring(start+1);
		else if(start<=end)
			return url.substring(start+1, end);
		else
			return url;	
	}
	
	/**
	 * 计算一个URL的hash值
	 * 结果为64BIT+16BIT的整数，这里转换为字符串返回
	 * 不用MD5是为了效率的考虑,数据库和索引在处理字符串时很慢
	 * 计算的方法很简单，MD5产生的是32个十六进制的字符，这里取低16位直接转换为64BIT的整数
	 * 最后取高4个字符转换为16BIT的字符，这里主要是解决冲突
	 * 返回的格式为64BIT-16BIT
	 * @param url
	 * @return
	 */
	/*
	public static String hash(String url)
	{
		String md5 = MD5.calcMD5(url);
		//截取低15个字符转换为整数
		long h1 = Long.parseLong(md5.substring(16,31), 16);
		//截取高4为转化为整数
		int h2 = Integer.parseInt(md5.substring(0,4), 16);
		
		return Long.toString(h1)+'-'+Integer.toString(h2); 
	}*/
	
	/**
	 * 截取低15位转化为整数
	 * @param url
	 * @return
	 */
	
	public static String hash(String url)
	{
		String md5 = MD5.calcMD5(url);
		//截取低15个字符转换为整数
		long h1 = Long.parseLong(md5.substring(16,31), 16);
		return Long.toString(h1);
	}
	
	/**
	 * 截取高4位转化为整数
	 * @param url
	 * @return
	 */
	public static String hash2(String url)
	{
		String md5 = MD5.calcMD5(url);
		//截取高4为转化为整数
		int h2 = Integer.parseInt(md5.substring(0,4), 16);
		return Integer.toString(h2);
	}
	
	
	public static void main(String[] args)
	{
		System.out.println(MD5.calcMD5("http://www.baidu.coms"));
		System.out.println(hash2("http://www.baidu.coms"));
	}
	
}
